<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" >

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js" integrity="sha256-iM4Yzi/zLj/IshPWMC1IluRxTtRjMqjPGd97TZ9yYpU=" crossorigin="anonymous"></script>
  <link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet">
  <link href="https://fonts.googleapis.com/css?family=Cousine|Inconsolata" rel="stylesheet">
  <link rel="shortcut icon" type="image/png" href="/favicon.png">

  <link rel="stylesheet" href="/css/style.css">
  <link rel="stylesheet" href="/css/css/fontawesome-all.min.css">
  <link rel="stylesheet" href="/css/css/work-sans-v7.css">
  <script src="/js/main.js"></script>

  <!-- Begin Jekyll SEO tag v2.6.1 -->
<title>RB: Stream Blockchain Transactions | Hive Developer</title>
<meta name="generator" content="Jekyll v4.0.0" />
<meta property="og:title" content="RB: Stream Blockchain Transactions" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="How to stream transactions and operations from Steem blockchain." />
<meta property="og:description" content="How to stream transactions and operations from Steem blockchain." />
<link rel="canonical" href="stream_blockchain_transactions.html" />
<meta property="og:url" content="stream_blockchain_transactions.html" />
<meta property="og:site_name" content="Hive Developer" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2020-08-26T11:52:22-07:00" />
<script type="application/ld+json">
{"description":"How to stream transactions and operations from Steem blockchain.","mainEntityOfPage":{"@type":"WebPage","@id":"stream_blockchain_transactions.html"},"@type":"BlogPosting","url":"stream_blockchain_transactions.html","headline":"RB: Stream Blockchain Transactions","dateModified":"2020-08-26T11:52:22-07:00","datePublished":"2020-08-26T11:52:22-07:00","@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->


  
</head>
<body>
<header>
  <h1>
    <button type="button" class="open-nav" id="open-nav"></button>
    <a href="/"  class="logo-link"><img src="/images/logotype_black.svg" height="40" alt="Hive Developer logo"></a>
  </h1>

  
  <form action="/search/" method="get">
    <input type="text" name="q" id="search-input" placeholder="Search">
    <input type="submit" value="Search" style="display: none;">
  </form>
  

  <div id="sidebar" class="sidebar">
	
	
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/">
		<h6 class="ctrl-nav-section title">Introduction</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/#introduction-welcome">Welcome to Hive</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/quickstart/">
		<h6 class="ctrl-nav-section title">Quickstart</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/quickstart/#quickstart-choose-library">Choose Library</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-hive-full-nodes">Hive Nodes</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-testnet">Hive Testnet</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/tutorials/">
		<h6 class="ctrl-nav-section title">Tutorials</h6>
		<ul class="cont-nav-section content">
			
				
					
						<li><a href="/tutorials/#tutorials-javascript">Javascript</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-python">Python</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-ruby">Ruby</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-recipes">Recipes</a></li>
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/services/">
		<h6 class="ctrl-nav-section title">Services</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/services/#services-hive-blog">hive.blog</a></li>
						
					
						
						<li><a href="/services/#services-hivesigner">HiveSigner</a></li>
						
					
						
						<li><a href="/services/#services-jussi">Jussi</a></li>
						
					
						
						<li><a href="/services/#services-imagehoster">ImageHoster</a></li>
						
					
						
						<li><a href="/services/#services-dhf">DHF</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/apidefinitions/">
		<h6 class="ctrl-nav-section title">Appbase API</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/apidefinitions/#apidefinitions-condenser-api">Condenser Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-bridge">Bridge</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-by-key-api">Account By Key Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-history-api">Account History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-block-api">Block Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-database-api">Database Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-debug-node-api">Debug Node Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-follow-api">Follow Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-jsonrpc">Jsonrpc</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-market-history-api">Market History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-network-broadcast-api">Network Broadcast Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rc-api">Rc Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-reputation-api">Reputation Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rewards-api">Rewards Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-tags-api">Tags Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-transaction-status-api">Transaction Status Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-witness-api">Witness Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops">Broadcast Ops</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops-communities">Broadcast Ops Communities</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/resources/">
		<h6 class="ctrl-nav-section title">Resources</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/resources/#resources-overview">Overview</a></li>
						
					
						
						<li><a href="/resources/#resources-client-libs">Client Libraries</a></li>
						
					
						
						<li><a href="/resources/#resources-bluepaper">Bluepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-whitepaper">Whitepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-tools">Tools</a></li>
						
					
						
						<li><a href="/resources/#resources-hivesigner-libs">Hivesigner Libs</a></li>
						
					
						
						<li><a href="/resources/#resources-hive-keychain">Hive Keychain</a></li>
						
					
						
						<li><a href="/resources/#resources-developeradvocate">Community & Help</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/glossary/">
		<h6 class="ctrl-nav-section title">Glossary</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/glossary/#glossary-chain-basics">Chain Basics</a></li>
						
					
						
					
						
						<li><a href="/glossary/#glossary-governance">Governance</a></li>
						
					
						
						<li><a href="/glossary/#glossary-transactions">Transactions</a></li>
						
					
						
						<li><a href="/glossary/#glossary-api">API</a></li>
						
					
						
						<li><a href="/glossary/#glossary-market">Market</a></li>
						
					
				
			
		</ul>
	</section>
	
</div>



  <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
</header>
<div class="main" id="top">
  <div class="hero">
    <h1 class="hero__h1">Hive Developer Portal </h1>
    <img class="hero__img" src="/images/honey-comb-92.png" style="position: relative; top: 10px;" />
  </div>
  <section id="tutorials-ruby-stream-blockchain-transactions" class="row tutorials-ruby-stream-blockchain-transactions">
	<h3>
		<a id="tutorials-ruby-stream-blockchain-transactions">
			RB: Stream Blockchain Transactions
			
		</a>
	</h3>
	
		<span class="description"><p><em>How to stream transactions and operations from Steem blockchain.</em></p>
</span>
	

	<p><span class="fa-pull-left top-of-tutorial-repo-link"><span class="first-word">Full</span>, runnable src of <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/ruby/tutorials/13_stream_blockchain_transactions">Stream Blockchain Transactions</a> can be downloaded as part of: <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/ruby">tutorials/ruby</a>.</span>
<br /></p>

<p>To respond to live activity on the blockchain, a common approach is to make a request for the current block number, access all of the information in that block, and repeat.  Many API clients have dedicated tools for simplifying this process.  In Radiator, this tool is part of the <code class="highlighter-rouge">Radiator::Stream</code> class.  In addition, Radiator will allow you to specify exactly what type of operation you’re interested in.</p>

<h3 id="sections">Sections</h3>

<ol>
  <li><a href="#streaming-transactions">Streaming Transactions</a></li>
  <li><a href="#streaming-operations">Streaming Operations</a></li>
  <li><a href="#to-run">To Run</a> - Running the example.</li>
</ol>

<h3 id="streaming-transactions">Streaming Transactions</h3>

<p>In the example script, we can stream transactions with the following arguments:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby stream_blockchain_transactions.rb <span class="nb">head </span>transactions
</code></pre></div></div>

<p>This will instruct the script to follow transactions at head <code class="highlighter-rouge">block_num</code> instead of irreversible.</p>

<p>See: <a href="https://developers.steem.io/tutorials-recipes/understanding-dynamic-global-properties#head_block_number"><code class="highlighter-rouge">head_block_number</code></a> vs. <a href="https://developers.steem.io/tutorials-recipes/understanding-dynamic-global-properties#last_irreversible_block_num"><code class="highlighter-rouge">last_irreversible_block_num</code></a></p>

<p>This is done by using the following ruby:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">stream</span><span class="p">.</span><span class="nf">transactions</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">trx</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="no">JSON</span><span class="p">.</span><span class="nf">pretty_generate</span> <span class="n">trx</span>
<span class="k">end</span>
</code></pre></div></div>

<p>The <code class="highlighter-rouge">args</code> variable contains the <code class="highlighter-rouge">start</code> (<code class="highlighter-rouge">block_num</code> to start from) and <code class="highlighter-rouge">mode</code> (<code class="highlighter-rouge">head</code> or <code class="highlighter-rouge">irreversible</code>).</p>

<h4 id="streaming-operations">Streaming Operations</h4>

<p>In the example script, we can also pass the following arguments:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby stream_blockchain_transactions.rb <span class="nb">head </span>ops comment
</code></pre></div></div>

<p>This will instruct the script to follow the blockchain at head <code class="highlighter-rouge">block_num</code> instead of irreversible.  It will stream operations, with the type of <code class="highlighter-rouge">comment</code>.</p>

<p>The script will allow multiple operation types:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby stream_blockchain_transactions.rb <span class="nb">head </span>ops comment vote
</code></pre></div></div>

<p>Virtual operations are also allowed, but make sure to pass <code class="highlighter-rouge">irreversible</code> instead of <code class="highlighter-rouge">head</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby stream_blockchain_transactions.rb irreversible ops producer_reward author_reward
</code></pre></div></div>

<p>Or, if you pass no operation types, the script will stream all types:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby stream_blockchain_transactions.rb <span class="nb">head </span>ops
</code></pre></div></div>

<p>This is done by using the following ruby:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">stream</span><span class="p">.</span><span class="nf">operations</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">op</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="n">op</span><span class="p">.</span><span class="nf">to_json</span>
<span class="k">end</span>
</code></pre></div></div>

<p>The <code class="highlighter-rouge">type</code> variable can be <code class="highlighter-rouge">nil</code> or the type of ops we’re looking for whereas <code class="highlighter-rouge">args</code> contains the <code class="highlighter-rouge">start</code> (<code class="highlighter-rouge">block_num</code> to start from) and <code class="highlighter-rouge">mode</code> (<code class="highlighter-rouge">head</code> or <code class="highlighter-rouge">irreversible</code>).</p>

<h3 id="to-run">To Run</h3>

<p>First, set up your workstation using the steps provided in <a href="https://developers.steem.io/tutorials-ruby/getting_started">Getting Started</a>.  Then you can create and execute the script (or clone from this repository):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone git@github.com:steemit/devportal-tutorials-rb.git
<span class="nb">cd </span>devportal-tutorials-rb/tutorials/13_stream_blockchain_transactions
bundle <span class="nb">install
</span>ruby stream_blockchain_transactions.rb
</code></pre></div></div>

<h3 id="example-output">Example Output</h3>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"piggypet"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"tanama"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"daily-2018-9-12"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"votes4minnows"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"askquestion"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"latest-bitcoin-price-and-news-update-13-09-2018"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">250</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"vncedora2018"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"adncabrera"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"nicomedescuentalacadadelreytanospoema-98jxnjsjzu"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"baimatjeh81"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"albertvhons"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"promoting-steemit-post-via-proof-of-participation-pop"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"steemulator"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"bonanza-kreep"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"communicate-and-travel-with-alfa-enzo-new-social-network"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"kernigeetrueset"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"haejin"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"vitamin-shoppe-vsi-analysis"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"borrowedearth"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"rijalmahyud"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"this-is-my-job"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"renatdag"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"algarion"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"cards-3-1536663927"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"elieserurabno"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"cathyhaack"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"my-introduction-hello-word-of-steemit"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"jmotip"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"glennolua"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"btc-chart-review-sept-12-20-00-pst"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"bishalacharya"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"barber78"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"beautiful-cloudformations"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"ivan174"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"securixio"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"cloud-mining-is-no-longer-profitable"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">10000</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="nl">"voter"</span><span class="p">:</span><span class="s2">"admiralbot"</span><span class="p">,</span><span class="nl">"author"</span><span class="p">:</span><span class="s2">"homsys"</span><span class="p">,</span><span class="nl">"permlink"</span><span class="p">:</span><span class="s2">"rare-photo-picture-698-105"</span><span class="p">,</span><span class="nl">"weight"</span><span class="p">:</span><span class="mi">-10000</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

</section>

</div>
<div class="footer">
  <a href="#">Back to top</a>
</div>
<script>
    document.getElementById("open-nav").addEventListener("click", function () {
        document.body.classList.toggle("nav-open");
    });
</script>
</body>
</html>


<script src="/js/adjust.js"></script>

